package leetcode.editor.cn;
//leetcode submit region begin(Prohibit modification and deletion)

/**
 * 给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，
 * 使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
 *
 * 由于在某些语言中不能改变数组的长度，所以必须将结果放在数组nums的第一部分。
 * 更规范地说，如果在删除重复项之后有 k 个元素，
 * 那么 nums 的前 k 个元素应该保存最终结果。
 *
 * 将最终结果插入 nums 的前 k 个位置后返回 k 。
 *
 * 不要使用额外的空间，你必须在 原地 修改输入数组 并在使用 O(1)
 * 额外空间的条件下完成。
 *
 * 示例 1：
 *
 * 输入：nums = [1,1,2]
 * 输出：2, nums = [1,2,_]
 * 解释：函数应该返回新的长度 2 ，并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

 */

/**
 * 高效解决这道题就要用到快慢指针技巧：
 *
 * 我们让慢指针 slow 走在后面，快指针 fast 走在前面探路，找到一个不重复的元素就赋值给 slow 并让 slow 前进一步。
 *
 * 这样，就保证了 nums[0..slow] 都是无重复的元素，当 fast 指针遍历完整个数组 nums 后，nums[0..slow]
 * 就是整个数组去重之后的结果。
 */
class Solution {
    public int removeDuplicates(int[] nums) {

        if(nums.length == 0){
            return 0;
        }
        // 快慢指针
        int slow = 0,fast = 0;
        while (fast < nums.length){
            // 如果不相等，就往前移动
            if(nums[slow] != nums[fast]){
                slow ++;
                //
                nums[slow] = nums[fast];
            }
            fast ++;


        }

        return slow + 1;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
